在多进程应用中使用 WorkManager
作者 / Android 开发者关系 Ben Weiss
在本文末尾,我还将列出此版本 WorkManager 库中的一些其他行为变更和新增内容。
隆重推出: work-multiprocess
Implementation "androidx.work:work-multiprocess:2.5.0"
选择 https://developer.android.google.cn/topic/libraries/architecture/workmanager/advanced/custom-configuration
class MyApplication() : Application(), Configuration.Provider { override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setProcessName("com.example:remote")
.build()
}
注意: 您需要传递完全限定的进程名称作为 setProcessName 的参数,该名称由您的应用包名称,后跟英文冒号和主机的进程名称组成,例如 com.example:remote。
RemoteWorkManager
https://developer.android.google.cn/reference/androidx/work/multiprocess/RemoteWorkManager
优势
按照上述方法配置 WorkManager 并使用 RemoteWorkManager 调度作业时,您的工作会在多进程应用中得到更快速、更可靠的管理。这是因为 SQLite 争用情况会大大减少 (因为我们不再依赖于以文件为基础的锁定),且不再需要跨进程的作业协调,因为您的应用仅会在您指定的进程中运行单个 WorkManager 实例。
争用
https://en.wikipedia.org/wiki/Resource_contention
行为变更 🔀
作业协调
之前,当 ActivityManager 无法实例化 JobService 以启动作业时,该作业将因为平台中的底层问题而被静默删除。WorkManager 现在可确保通过协调 WorkRequest 对象与作业创建 "应用" 实例时,每个 WorkRequest 都会有一个后备调度程序作业。
限制内部数据库增长
我们发现应用崩溃的原因之一是设备存储空间不足。这种情况主要发生在存储空间本来就很少的设备上。但是,当应用调度大量工作时,导致设备存储空间不足的部分原因在于 WorkManager。
默认情况下,内部的 WorkManager 数据库会将已完成作业的记录保留 7 天。而现在,这个期限已减少至 1 天,大大降低了数据库的大小。
我们缩短了缓冲区持续时间,这样您就能借助 keepResultsForAtLeast() API 控制作业应被保留的时长。
全新测试 API ✨
如果您将 ListenableFuture 和 WorkManager 配合使用,测试工作会变得更轻松 — TestListenableWorkerBuilder Kotlin 扩展程序现在可以接收任何类扩展 ListenableWorker,从而在测试过程中为您提供更高的灵活性。
问题修复 🐛
除了新增的功能,此版本还包含多个错误修复,以提高 WorkManager 的稳定性、可靠性和性能。您可以在版本说明中查看所有更改以及修复的错误。
版本说明
https://developer.android.google.cn/jetpack/androidx/releases/work#2.5.0
如何改进 WorkManager
WorkManager 以及其他几个 Jetpack 库都接受通过 GitHub 贡献的内容。
Alan Viverette 撰写了一篇关于整个流程的详尽博文。
Alan Viverette https://medium.com/@alan.viverette 详尽博文 https://medium.com/androiddevelopers/introducing-jetpack-on-github-c2c9f12e62a9
2.5.0 版本中修复的大部分错误都是通过公开问题跟踪器报告的。
公开问题跟踪器 https://issuetracker.google.com/issues?q=componentid:409906
创建可修复问题的最佳方式就是创建一个我们可复现的问题。为帮助我们再现问题,建议您使用该 WorkManager 示例,或通过问题描述提供您的示例代码。
创建可复现的问题 https://issuetracker.google.com/issues/new?component=409906 WorkManager 示例 https://github.com/android/architecture-components-samples/tree/main/WorkManagerSample
是时候行动起来,并更新您应用中使用的 WorkManager 库了。
推荐阅读